/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.utn.tpsimulacion06;

import java.util.ArrayList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author aaltamir
 */
public class EulerManager {

    public EulerManager( JTable tabla, double h, double a) {
        this.h = h;
        this.a = a;
        this.T = 0.1;
        this.t = 0;
        this.dT = 0;
        this.tabla = tabla;
        dtm = (DefaultTableModel) tabla.getModel();
       
    }

    

    public double getT() {
        return T;
    }

    public double getdT() {
        return dT;
    }

    public double getA() {
        return a;
    }

    public void setA(double a) {
        this.a = a;
    }

    public double getH() {
        return h;
    }

    public void setH(double h) {
        this.h = h;
    }
    //valor h
    private double h;
    //tiempo
    private double t;
    //porcentaje de llenado Actual
    private double T;
    //derivada de la funcion de llenado
    private double dT;
    //parametro alfa sacado del valor de aproximadamente 20 llegadas de barco
    private double a;
    
    //Tabla en la que se va a mostrar el calculo de euler
    JTable tabla;
    DefaultTableModel dtm;
    
    /**
     * Este metodo determina cuando se va a producir el proximo bloqueo de la grua
     * @param random Un Random aleatorio Uniforme
     * @return el tiempo en el que se espera el proximo bloqueo.
     */
    public double getProximoBloqueo(double random){
        this.clear();
        if(random < 0 || random >=1){
            return -1;
        }
        // Probabilidad del 20%: El sistema se vuelve inestable con el 50%
        //del espacio total ocupado (E)
        if(random >=0 && random < 0.20){
            return this.iterarHasta(50);
        }
        if(random >=0.20 && random < 0.50){
            return this.iterarHasta(70);
        }
        if(random >=0.50 && random < 1){
            return this.iterarHasta(100);
        }
        return -1;
    }

 public double iterarHasta(double valorTope){
       List lista = new ArrayList();
       lista.add(t);
       lista.add(T);
       lista.add(this.getDT());
       dtm.addRow(lista.toArray());
     do {
            List nuevaIteracion = this.iteracion();
            dtm.addRow(nuevaIteracion.toArray());
        }
        while(T < valorTope);
        return this.t;
    }
    
    /**
     * representa una iteracion: actualiza todos los valores de la fila del euler.
     * @return 
     */
    
    public List iteracion(){
        List vectorEuler = new ArrayList();
        t = t+h;
        vectorEuler.add(t);
        T = T + h*this.getDT();
        vectorEuler.add(T);
        vectorEuler.add(this.getDT());        
        return vectorEuler;
        
    }
    public double getDT(){
        return a *T;
    }
    public void clear(){
        t = 0;
        T = 0.1;
        dT = 0;
        
    }
    
    
    
}
